package com.tangfuzhong.aop2;

import org.aopalliance.intercept.MethodInvocation;

import java.util.Arrays;

/**
 * <p><em>Created on 2021/12/28 5:02 下午</em></p>
 *
 * @author fuzhongtang
 * @since 1.0.1
 */
public class ConsoloEnhancer {
    /**
     * 前置增强方法
     *
     * @param mi
     */
    public void before(MethodInvocation mi) {
        /*
         * 这里的MethodInvocation类型参数mi和开发中常用的切点工具类JoinPoint的作用类似,它可以获取
         * 目标对象（"Object getThis()"方法）、目标方法("Method getMethod()"方法)、
         * 方法参数（"Object[] getArguments()"方法）等信息
         */
        System.out.print("调用了" + mi.getThis() + "对象的" + mi.getMethod().getName() + "方法。方法入参原始值是"
                + Arrays.toString(mi.getArguments()) );
        if (mi.getThis().getClass() == UserDaoImpl.class) {         //对方法入参进行修改
            Object[] args = mi.getArguments();
            String enhancedAgr ="user-" +(String) args[0]  ;
            args[0] = enhancedAgr;
        }
        System.out.println(".而增强后的方法入参是"+Arrays.toString(mi.getArguments()) );
        System.out.println("*********************前置增强加星号 *********************");
    }

    /**
     * 处理异常的增强方法
     *
     * @param mi
     * @param e
     */
    public void afterThrowing(MethodInvocation mi, Throwable e) {
        System.out.println("调用了" + mi.getThis() + "对象的" + mi.getMethod().getName() + "方法,当方法入参是"
                + Arrays.toString(mi.getArguments()) + "时，发生了异常。");
        System.out.println("异常的堆栈信息是" + Arrays.toString(e.getStackTrace()));
        System.out.println("!!!!!!!!!!!!!!!!!!!!!异常加感叹号!!!!!!!!!!!!!!!!!!!!!!");
    }
}
